#pragma once
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include<assert.h>

#define POS_X 24
#define POS_Y 5



//类型的声明  

//枚举蛇的方向类型
enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};


//枚举蛇的状态类型
//正常，撞墙，撞到自己，正常退出
enum GAME_STATUS
{
	OK, //正常
	KILL_BY_WALL, //撞墙
	KILL_BY_SELF, //撞到自己
	END_NORMAL //正常退出
};


//蛇身的节点类型
typedef struct SnakeNode
{
	//节点坐标
	int x;
	int y;
	//指向下一个节点的指针
	struct SnakeNode* _next;
}SnakeNode;

//对这个结构体指针重命名
typedef struct SnakeNode* pSnakdeNode;

//贪吃蛇类型
typedef struct Snake
{
	pSnakdeNode _pSnake; //指向蛇头结点的指针
	pSnakdeNode _pfood;  //指向食物结点(和蛇身节点差不多)的指针
	enum DIRECTION _dir; //蛇的方向
	enum GAME_STATUS _status; //蛇的状态
	int _food_weight; //一个食物得的分数
	int _score; //总成绩
	int _sleep_time; //休息时间，休息时间越长（短），速度越慢（长）
}Snake, * pSnake;


//函数的声明

// 清空控制台输入缓冲区
void ClearConsoleInputBuffer();

//从文件中读取记录
void dataload();

//保存记录到文件函数
void datasave();


//设置光标位置函数
void SetPos(short x, short y);

//游戏的初始化
void GameStart(pSnake ps);

//开始界面的打印
void WelcomeToGame();

//绘制地图函数
void CreateMap();

//创建蛇身
void InitSnake(pSnake ps);

//创建食物
void CreateFood(pSnake ps);


//游戏运行的逻辑
void GameRun(pSnake ps);

//蛇的移动
void SnakeMove(pSnake ps);

//判断蛇下一个坐标是否是食物
bool NextIsFood(pSnakdeNode pnext, pSnake ps);

//下一个位置是食物就吃掉
void EatFood(pSnakdeNode pnext, pSnake ps);

//下一个位置不是食物就头插这个节点，然后处理尾节点
void NoFood(pSnakdeNode pnext, pSnake ps);

//检测蛇是否撞墙
void KillByWall(pSnake ps);

//检测蛇是否撞到自己
void KillBySelf(pSnake ps);

//游戏结束
void GameEnd(pSnake ps);